// cf-286e.cc
// 题意：
// 给定n(<=10^6)个带子和给定一个m(<=10^6)，第i个带子容量ai, 第i个带子也不能
// 装容量小于ai的物品。每个物品数量都是无限的， 你需要寻找一个物品的
// 重量集合p1, p2, ..., pk(1<=p1<p2<...<pk)，满足：
// 1. 每个带子ai，都会存在某个物品集合，使得物品重量和为ai；
// 2. 对于任意物品集合重量小于等于m的，都需要有一个带子的重量与子对应；
// 3. 满足1，2条件下，求最小的k。
// 一个物品的集合可以包含相同重量的物品。
// 你要找是不是存在这么一组解，如果存在就输出任意一种方案，不存在输出NO。
//
// 题解：
// 其实只需要弄个多项式f(x)=sigma(x^ai)，算个卷积就好。如果出现了除了
// 指数为ai之外的项，那肯定是不可行的，因为每个物品都是无限重量的。
// 如果合法，那么取出卷积系数为1的那些作为物品重量就可以了。
//
//
// run: $exec < input
#include <iostream>
#include <vector>
#include <algorithm>
#include <complex>

int const maxn = 1000007;
int n, m;
std::vector<int> a;
std::vector<int> res;

namespace fft
{
	double const pi = std::acos(-1);
	typedef std::complex<double> base;
	typedef std::vector<base>::iterator it_type;

	int rev[maxn * 8];
	base wlen_pw[maxn * 8];
	int last_rev = -1;

	void fft(std::vector<base> & a, bool invert)
	{
		int n = a.size();
		for (int i = 0; i < n; i++)
			if (i < rev[i]) std::swap(a[i], a[rev[i]]);

		for (int len = 2; len <= n; len *= 2) {
			double ang = (2 * pi / len) * (invert ? -1 : 1);
			int len2 = len / 2;
			base wlen(std::cos(ang), std::sin(ang));
			wlen_pw[0] = base(1, 0);
			for (int i = 1; i < len2; i++)
				wlen_pw[i] = wlen_pw[i - 1] * wlen;

			for (int i = 0; i < n; i += len) {
				base t;
				it_type pu = a.begin() + i;
				it_type pv = a.begin() + i + len2;
				it_type pu_end = a.begin() + i + len2;
				base* pw = wlen_pw;
				for (; pu != pu_end; ++pu, ++pv, ++pw) {
					t = *pv * *pw;
					*pv = *pu - t;
					*pu += t;
				}
			}
		}

		if (!invert) return;
		for (int i = 0; i < n; i++) a[i] /= n;
	}

	void calc_rev(int n)
	{
		if (last_rev == n) return;
		last_rev = n;
		int logn = 0;
		while ((1 << logn) < n) logn++;
		for (int i = 0; i < n; i++) {
			rev[i] = 0;
			for (int j = 0; j < logn; j++)
				if (i & (1 << j))
					rev[i] |= 1 << (logn - j - 1);
		}
	}

	void multiply(std::vector<int> const& a, std::vector<int> const& b, std::vector<int> & res, int & len)
	{
		std::vector<base> fa(a.begin(), a.end());
		std::vector<base> fb(b.begin(), b.end());
		size_t n = 1;
		while (n < std::max(a.size(), b.size())) n *= 2;
		n *= 2;
		fa.resize(n); fb.resize(n);

		calc_rev(n);
		fft(fa, false); fft(fb, false);
		for (size_t i = 0; i < n; i++) fa[i] *= fb[i];
		fft(fa, true);

		len = n; res.resize(n);
		for (size_t i = 0; i < n; i++)
			res[i] = round(fa[i].real());
	}
}

bool vis[maxn];
std::vector<int> ans;

int main()
{
	std::ios_base::sync_with_stdio(false);
	std::cin >> n >> m;
	a.resize(maxn);
	for (int i = 0, x; i < n; i++) {
		std::cin >> x; a[x] = 1;
		vis[x] = true;
	}
	int len;
	std::vector<int> b = a;
	b[0] = 1;
	fft::multiply(a, b, res, len);

	bool ok = true;
	/*
	for (int i = 0; i < len; i++)
		if (res[i]) std::cout << res[i] << "*x^" << i << "\n";
	*/

	for (int i = 0; i < std::min(len, m + 1); i++) {
		if (!res[i]) continue;
		if (!vis[i]) {
			ok = false;
			break;
		}
		if (res[i] > 1) continue;
		ans.push_back(i);
	}
	if (ok) {
		std::cout << "YES\n" << ans.size() << "\n";
		for (size_t i = 0; i < ans.size(); i++)
			std::cout << ans[i] << " ";
		std::cout << "\n";
	} else
		std::cout << "NO\n";
}

